package rkdwogus7.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import rkdwogus7.model.MemberVO;
import rkdwogus7.utils.OracleJDBC;

// 1. 드라이버 등은 매 번 선언하기가 쉽지 않고, 인터페이스를 통하지 않고 직접 DAO를 해 보고 있어
// 그래서 SQL문을 제외한 다른 것들을 따로 빼 보도록 할 거야.
// 참고 : PL/SQl을 쓰는 이유는 동적 쿼리문을 만들어서 SQL문을 쉽게 사용하기 위함이야.
public class MemberDAO {
	private static final String insertSQL = " insert into memberv1(mno, userid, pwd, name, gender) values(mbseq.nextval, ?, ?, ?, ?) ";
	private static final String updateSQL = " update memberv1 set name = ?, pwd = ?, regdate = sysdate where mno = ? ";
	private static final String deleteSQL = " delete from memberv1 where mno = ? ";
	private static final String selectSQL = " select mno, userid, name, regdate from memberv1 order by mno desc ";
	private static final String selectOneSQL = " select * from memberv1 where mno = ? ";
	
	// 회원 가입 insert
	public int insertMember(MemberVO m) {
		Connection conn = null;
		PreparedStatement ps = null;
		int cnt = 0;
		
		try {
			conn = OracleJDBC.openConn();
			// 이러면 DB연결이 바로 됨
			ps = conn.prepareStatement(insertSQL);
			ps.setString(1, m.getUserid());
			ps.setString(2, m.getPwd());
			ps.setString(3, m.getName());
			ps.setString(4, m.getGender());
			
			cnt = ps.executeUpdate();
			// 이렇게 하면 빠르게 완성이 된 거지. insert문의 ?값을 받아 와서 실행까지 시킨 거야
			// 여기까지 하고 스윙으로 가는거야
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			OracleJDBC.closeConn(conn, ps, null);
			// select가 아닌 경우라면 이렇게 rs값을 null로 주면 되는거지. 다 닫히는 거야
		}
		
		return cnt;
	}
	
	// 회원 수정 update
	public int updateMember(MemberVO m) {
		Connection conn = null;
		PreparedStatement ps = null;
		int cnt = 0;
		
		try {
			conn = OracleJDBC.openConn();
			ps = conn.prepareStatement(updateSQL);
				ps.setString(1, m.getName());
				ps.setString(2, m.getPwd());
				ps.setString(3, m.getMno());
			cnt = ps.executeUpdate();
			
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			OracleJDBC.closeConn(conn, ps, null);
		}
		
		return cnt;
	}

	// 회원 삭제 delete
	public int deleteMember(String mno) {
		Connection conn = null;
		PreparedStatement ps = null;
		int cnt = 0;
		
		try {
			conn = OracleJDBC.openConn();
			ps = conn.prepareStatement(deleteSQL);
			ps.setString(1, mno);
			cnt = ps.executeUpdate();
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			OracleJDBC.closeConn(conn, ps, null);
		}
		
		return cnt;
	}
	
	// 회원정보 전체 조회 select
	public ArrayList<MemberVO> selectMember() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		ArrayList<MemberVO> list = new ArrayList<>();
		
		try {
			// 여기가 중요한 부분. 여기가 되어야 스윙 화면에서 나오는거야.
			conn = OracleJDBC.openConn();
			ps = conn.prepareStatement(selectSQL);
			rs = ps.executeQuery();
			while (rs.next()) {
				MemberVO m = new MemberVO(rs.getString(1), rs.getString(2), null, rs.getString(3), null, rs.getString(4));
				list.add(m);
			}
			// 이게 내가 모르는 부분이야. 이걸 잘 봐
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			OracleJDBC.closeConn(conn, ps, rs);
		}
		
		return list;
	}
	
	// 회원정보 상세 조회
	// 회원 1명의 정보니까 이렇게 써 주는 거야
	public MemberVO selectOneMember(String mno) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		MemberVO m = new MemberVO();
		
		try {
			conn = OracleJDBC.openConn();
			ps = conn.prepareStatement(selectOneSQL);
				ps.setString(1, mno); // 매개변수 설정
			rs = ps.executeQuery(); // 실행
			while (rs.next()) {
				m = new MemberVO(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6));
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			OracleJDBC.closeConn(conn, ps, rs);
		}
		
		return m;
	}
	
}



